package fanxing20230413;
class Food {

}
class Fruit extends Food {

}
class Apple extends Fruit {

}
class Banana extends Fruit {

}
class Plate<T> {
    private T message;

    public T getMessage() {
        return message;
    }

    public void setMessage(T message) {
        this.message = message;
    }
}
public class Text3 {
    public static void main(String[] args) {
        Plate<Fruit> fruitPlate = new Plate<>();
        fruitPlate.setMessage(new Fruit());
        func2(fruitPlate);

        Plate<Food> foodPlate = new Plate<>();
        foodPlate.setMessage(new Food());
        func2(foodPlate);
    }
    //如果是super就是需要传Fruit或者Fruit的父类
    //如果是extend就是需要传Fruit或者Fruit的子类
    public static void func2(Plate<? super Fruit> temp) {//通配符的上界
        temp.setMessage(new Apple());
        temp.setMessage(new Banana());//此时可以修改，此时已经是上界了，哪一个子类都可以
        System.out.println(temp.getMessage());

        //Fruit fruit = temp.getMessage();//此时不能获取，因为Fruit可能还有父类的父类
        //不能拿fruit来接收，此时不知道传过来的参数是自己还是父类
        //通配符的下界一般用来写入数据
    }
    public static void main1(String[] args) {
        Plate<Apple> applePlate = new Plate<>();
        applePlate.setMessage(new Apple());
        func(applePlate);

        Plate<Banana> bananaPlate = new Plate<>();
        bananaPlate.setMessage(new Banana());
        func(bananaPlate);
    }
    public static void func(Plate<? extends Fruit> temp) {//通配符的上界
        //此时可以获取，因为虽然不知道参数到底是哪一个，但是一定是我的子类
        Fruit fruit = temp.getMessage();

        //这里仍然不可以进行修改！ 因为Fruit的子类有很多，不知道是哪一个
        System.out.println(temp.getMessage());

        //通配符的上界一般用来读取数据
    }
}
